1、设备文件
	在Linux中有一切皆文件的概念，所以在Linux中将设备抽象成了文件（网络设备除外），以此将对设备的访问转换为对文
件的访问
2、设备号
	设备号包括主设备号和次设备号两部分，在32位环境中设备号用一个32位变量表示，其中主设备号占高12位，次设备号占
低20位，系统通过设备号来区分不同的设备（Linux内核通过主设备号查找对应的驱动程序，在驱动程序中可通过次设备号区分
不同的设备）
3、 struct cdev 对象
	内核通过 cdev 对象管理相应的字符设备，一个 cdev 对象可以同时管理多个字符设备
4、 struct file_operations 对象
	file_operations 对象包含字符设备的操作方法集合，其中主要包括以下几个方法：
	//定位读写位置
	loff_t (*llseek) (struct file *, loff_t, int);
	//读数据
	ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
	//写设备
	ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
	//控制设备
	long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
	//功能与unlocked_ioctl一样，只有在64位系统中运行32位程序时才会调用
	long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
	//将设备内存映射到用户空间
	int (*mmap) (struct file *, struct vm_area_struct *);
	//打开设备
	int (*open) (struct inode *, struct file *);
	//释放设备，最后一次调用close是执行
	int (*release) (struct inode *, struct file *);
	//多路复用I/O
	unsigned int (*poll) (struct file *, struct poll_table_struct *);
5、 struct file 对象
	file 对象表示一个打开的文件（包括设备文件），其中主要包括以下成员：
	//指向文件的inode节点
	struct inode		*f_inode;
	//文件打开方式，对应系统调用open的int flags参数
	unsigned int 		f_flags;
	//文件读/写模式，对应系统调用open的mod_t mode参数
	fmode_t			f_mode;
	//文件的当前读写位置，此值需要在驱动中更新
	loff_t			f_pos;
	//供驱动使用的私有数据
	void			*private_data;
6、 struct inode 对象
	inode 对象表示文件的inode节点，其中包含了设备的相关信息，主要成员如下：
	//设备号
	dev_t			i_rdev;
	//如果是块设备则指向对应的block_device对象
	struct block_device	*i_bdev;
	//如果是字符设备则指向对应的cdev对象
	struct cdev		*i_cdev;
7、注册字符设备
	1）注册设备号，使用register_chrdev_region静态注册或使用alloc_chrdev_region动态分配
	2）使用cdev_init初始化cdev对象
	3）使用cdev_add将设备添加到内核
	也可以使用register_chrdev一次性完成上面3个步骤，register_chrdev默认注册256个字符设备，共用一个主设备
号，子设备号从0~255
8、注销字符设备
	1）使用cdev_del从内核中删除cdev对象
	2）使用unregister_chrdev_region注销设备号
	如果使用register_chrdev注册，则应该使用unregister_chrdev注销
9、创建设备文件
	mknod 设备文件名 设备类型 主设备号 次设备号，其中设备类型有：c 字符设备，b 块设备，p 有名管道（fifo），如：
	mknod /dev/cdev c 249 0 //创建名为在 /dev 目录创建名为 cdev 的字符设备文件，主设备号为 249, 次设备号为 0
